<?php
/**
 * Clase que realiza las operaciones CRUD (Create, Read, Update, Delete) en la base de datos portatil.
 */
class TransclusionDAO{
    // Singleton
	private static $instance;

	// Url de la base de datos y matriz de los elementos ya cargados
    private $trDBUrl;
    private $trMatrix;

    // A private constructor; prevents direct creation of object
    private function __construct() {
		// TODO: $IP no está definido fuera del ámbito de MediaWiki (visualization issue)
	    global $IP;
		
		if( isset($IP) ){	// Inside MediaWiki
			$this->trDBUrl = "$IP/extensions/MediaWikiExtension/include/transclusiondb.db";
		}
		else{	// Visualization
			$this->trDBUrl = dirname( chdir("../") ) . "/transclusiondb.db";
		}
	    
    }

    // Singleton
    public static function singleton() {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }

        return self::$instance;
    }

    /**
     * Metodo de inicializacion de la Base de Datos
     *	- Si la base de datos no existe, la crea
     *	- En caso contrario, la deja intacta
     * @author: Jaime Penagos
     */ 
	public function initTransclusionDB() {
		// Se borra el archivo de base de datos que exista, para crear uno nuevo
		$bdExiste = file_exists( $this->trDBUrl );

		// Si la base de datos no existe, crearla.
		if ( !$bdExiste ) {
			// Se crea la base de datos
			$trDB = new SQLite3( $this->trDBUrl );

			// Si la base de datos fue creada sin problema
			if ( $trDB != false ) {
				$trDB -> query( "CREATE TABLE trtable (
					trid CHAR(5) NOT NULL,
                         sourceurl TEXT NOT NULL,
					targeturl TEXT NOT NULL,
                         sectionid INT NOT NULL,
					trtext TEXT NULL
				);" );

				$trDB -> query ("CREATE UNIQUE INDEX trDBUrl.primarykey ON trtable (trid, sourceurl);");

				$trDB -> close();
			}
		}

		$this->loadTransclusionMatrix();
	}

	/**
	 * Metodo que carga los valores de translcusion de la base de datos a una matriz local
	 * @author: Jaime Penagos
	 */
	private function loadTransclusionMatrix(){
		$trDB = new SQLite3( $this->trDBUrl );

		$results = $trDB -> query ( "SELECT * FROM trtable;" );

		// Se cargan los valores de la base de datos a la matriz
		$i = 0;
		while($res = $results->fetchArray(SQLITE3_ASSOC)){
			$this -> trMatrix[$i]['trid'] = $res['trid'];
			$this -> trMatrix[$i]['targeturl'] = $res['targeturl'];
			$this -> trMatrix[$i]['sourceurl'] = $res['sourceurl'];
			$this -> trMatrix[$i]['sectionid'] = $res['sectionid'];
			$this -> trMatrix[$i]['trtext'] = $res['trtext'];

			$i++;
		}
		$trDB -> close();
	}

	/**
	 * M�todo GET para la matriz de elementos de transclusiones
	 * @author: Jaime Penagos
	 */
	public function getTransclusionMatrix(){
		return $this -> trMatrix;
	}

	/**
	 * M�todo que actualiza el nuevo texto de la transclusi�n editada
	 * @param $id: id de la transclusi�n
	 * @param $text: texto a guardar
	 */
	public function updateTranscludedText( $id , $text ){
		$trDB = new SQLite3( $this->trDBUrl );

		$proccessedText = htmlspecialchars ( $text , ENT_QUOTES );

		$trDB -> query( "UPDATE trtable
			SET trtext = '" . $proccessedText . "'
			WHERE trid = '" . $id . "'

			;" );

		$trDB -> close();
	}

	/**
	 * Metodo que carga una transclusion
	 * @param $trid: id de la transclusion
	 * @param $articleName: nombre del articulo
	 * @return el elemento cargado de la base de datos con id $trid
	 * @return false si no encuentra el id en la base de datos
	 */
	public function getTransclusion( $articleName, $trid ){
		$i = 0;
		$nroElementos = count($this -> trMatrix);

		$indice = $i;
		$resultado = false;
		while ( $i < $nroElementos ){
			if( $this -> trMatrix[ $i ][ 'trid' ] == $trid){
				if( $this -> trMatrix[ $i ][ 'sourceurl' ] == $articleName){
					$indice = $i;
					$resultado = true;
				}
			}
			$i++;
		}

		if( $resultado ){
			return $this -> trMatrix[ $indice ];
		}
		else{
			return false;
		}
	}
	/**
	 *
	 * @param type $trid
	 * @param type $source
	 * @param type $target
	 * @param type $sectionId
	 * @param type $trtext
	 */
	public function registerTransclusion($trid, $source, $target, $sectionId, $trtext){
		$trDB = new SQLite3( $this->trDBUrl );

		// Si la base de datos fue creada sin problema
		if ( $trDB != false ) {
			$trDB -> query( "INSERT INTO trtable VALUES('$trid', '$source', '$target', '$sectionId', '$trtext');");

			$trDB -> close();
		}
	}
}
?>